//
//  YNMessage.h
//  Messenger
//
//  Created by iOS on 15/5/14.
//  Copyright (c) 2015年 YN-APP-iOS. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <UIKit/UIKit.h>
#import "YNIMFrameworkTypedef.h"
@class PictureModel;
@class XMPPMessage;
@class YNManyPeopleChat;
@class YNTwoPeopleChat;
@class YNUser;

@interface YNMessage : NSObject <NSCoding, NSCopying>
//文本消息(为解析后的Json)
@property (nonatomic, copy) NSString *text;

@property (nonatomic, strong) UIImage *photo;           //展示图片(缩略图)
@property (nonatomic, strong) UIImage *originPhoto;     //原图
@property (nonatomic, copy) NSString *originPhotoUrl;   //原图路径
@property (nonatomic, strong) NSString *fileName;       //文件名

@property (nonatomic, strong) UIImage *videoConverPhoto;
@property (nonatomic, copy) NSString *videoPath;
@property (nonatomic, copy) NSString *videoUrl;


@property (nonatomic, assign) NSInteger voiceState;//语音状态
@property (nonatomic, copy) NSString *voicePath;//声音路径
@property (nonatomic, copy) NSString *voiceDuration;//声音时间
@property (nonatomic, copy) NSString *voiceId;//GUID

/**
 *  压缩图
 */
@property(nonatomic,strong)UIImage * compressImage;

/**
 *  压缩图路径
 */
@property(nonatomic,strong)NSString  * compressPath;

/**
 *  是否压缩图片
 */
@property(nonatomic,assign)BOOL  isCompressImage ;


//是否转发
@property(nonatomic,assign)BOOL isTranspond ;

/**
 *  2018-6-7jc添加，直播聊天时，需要传会议Id
 会议ID
 */
@property(nonatomic,strong)NSString * mettingId;


@property (nonatomic, copy) NSString *emotionPath;

@property (nonatomic, strong) UIImage *localPositionPhoto;
@property (nonatomic, copy) NSString *geolocations;
@property (nonatomic, strong) CLLocation *location;

//绑定一个user对象
@property (nonatomic, strong)YNUser * userObj;
//头像
@property (nonatomic, strong) UIImage *avatar;

//头像url
@property (nonatomic, copy) NSString *avatarUrl;

//本人的名字
@property (nonatomic, copy) NSString *sender;

//messageMediaType 消息类型 (文本, 声音, 图片, 表情, 坐标, 混合, 文件,直播相关)
@property (nonatomic, assign) YNBubbleMessageMediaType messageMediaType;

//bubbleMessageType 消息发送发方 (消息是发送还是接受)
@property (nonatomic, assign) YNBubbleMessageType bubbleMessageType;



//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////

//from(是谁发送的 发送者)
@property (nonatomic, copy) NSString *fromUserId;

//to(是谁接收的 接收者)
@property (nonatomic, copy) NSString *toUserId;

//body(消息编码规范里面 Content: 消息内容)
@property (nonatomic, copy) NSString *body;

//sendTime(发送时间)
@property (nonatomic, strong) NSString *sendTime;

//receiveTime(接收时间)
//@property (nonatomic, strong) NSString *receiveTime;

//是否已读
@property (nonatomic) BOOL isRead;

//是否显示时间
@property (nonatomic) BOOL isShowTime;

//广播标题
@property (nonatomic, copy) NSString *subject;

//当前消息界面显示的时间
@property (nonatomic, copy) NSString *currentTime;

//与当前帐号聊天的userNo(对方UserNo,群id)
@property (nonatomic, copy) NSString *friendId;

//对方的名字(发送消息者的名字)
@property (nonatomic, copy) NSString *friendName;

//消息ID
@property (nonatomic, copy) NSString *packetId;

//完整信息(所有信息)
@property (nonatomic ,copy) NSString *message;

//发送状态
@property (nonatomic) YNMessageSendState sendState;

//如果是群，群的名字
@property (nonatomic, copy) NSString *groupName;

//消息类型
@property (nonatomic) YNBubbleMessageChatType chatType;

//消息的高度(纯消息高度, 不是整个Cell的高度, 也不是背景图片的高度)
//@property (nonatomic) CGFloat messageHeight;

/**
 *  2018-11-28JC添加，增加cell高度，不用每次从新计算。数据库中没有这个值
 */
@property(nonatomic,assign)CGFloat cellHeight;

@property(nonatomic,assign)CGFloat messageHeight;

/**
 *  如果是YNet8.0来的广播通知
 *  需要加几个字段
 */

//广播通知的类型
@property (nonatomic) YNBroadcastNotificationType broadcastNotificationType;

//来源终端
@property (nonatomic) YNBroadcastNotificationSourceTerminal sourceTerminal;

//文件状态
@property (nonatomic) NSInteger fileState;
//文件下载上传的进度
@property (nonatomic,assign)CGFloat fileProgress;
//文件下载上传的进度回调
@property (nonatomic,copy)void(^progressBlock)(CGFloat progress);
/**
 * JC添加-用于测回消息判断
 *  YES：撤回,NO:正常消息
 */
@property(nonatomic,assign)BOOL isMessageWithdraw;


/**
 *  ait数据
 */
@property(nonatomic,strong)NSString * aitContactMarkArray;

//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////

/**
 *  初始化混合图片，文本消息(纯文本消息)
 *
 *  @param text         发送的目标文本
 *  @param toUserId     接收者的UserId
 *  @param chatType     消息类型
 *  @param groupName    群名字(如果是群消息)
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithMixText:(NSString *)text
                       toUserId:(NSString *)toUserId
                       chatType:(YNBubbleMessageChatType)chatType
                      groupName:(NSString *)groupName
                      mettingId:(NSString *)mettingId
                           body:(NSString *)body
                        message:(NSString *)message;

/**
 *  视频会议消息 文本消息(纯文本消息)
 *
 *  @param text         发送的目标文本
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initMeetingMessageWithText:(NSString *)text
                                 mettingId:(NSString *)mettingId;

/**
 *  初始化文本消息
 *
 *  @param text         发送的目标文本
 *  @param toUserId     接收者的UserId
 *  @param chatType     消息类型
 *  @param groupName    群名字(如果是群消息)
 *  @param mettingId    直播会议id

 *  @return 返回Message model 对象
 */
- (instancetype)initWithText:(NSString *)text
                    toUserId:(NSString *)toUserId
                    chatType:(YNBubbleMessageChatType)chatType
                   groupName:(NSString *)groupName
                   mettingId:(NSString *)mettingI;


/**
 初始化文本消息(文件接收的文本消息)
 
 @param text 发送的目标文本
 @param packetId 文本的packetId
 @param toUserId 接收者的UserId
 @param chatType 消息类型
 @param groupName 群名字(如果是群消息)
 @return 返回Message model 对象
 */
- (instancetype)initWithReturnFileText:(NSString *)text
                              packetId:(NSString *)packetId
                              toUserId:(NSString *)toUserId
                              chatType:(YNBubbleMessageChatType)chatType
                             groupName:(NSString *)groupName;

/**
 *  直播会议期间初始化图片类型的消息
 */
- (instancetype)initMeetingImageMessageWithAssets:(PictureModel *)assets
                                        mettingId:(NSString *)mettingId downUrl:(NSString*)downUrl;

/**
 *  初始化图片类型的消息
 *
 *  @return 返回Message model 对象
 */

- (instancetype)initWithAssets:(PictureModel *)assets
                      toUserId:(NSString *)toUserId
                      chatType:(YNBubbleMessageChatType)chatType
                     groupName:(NSString *)groupName;

//初始化文件消息对象
- (instancetype)initWithFileName:(NSString *)fileName
                        filePath:(NSString*)originPath
                          fileId:(NSString*)fileId
                 transpondFileId:(NSString*)transpondFileId
                        fileSize:(NSUInteger)fileSize
                        toUserId:(NSString *)toUserId
                        chatType:(YNBubbleMessageChatType)chatType
                       groupName:(NSString *)groupName;

/**
 *  初始化视频类型的消息
 *
 *  @param videoConverPhoto 目标视频的封面图
 *  @param videoPath        目标视频的本地路径，如果是下载过，或者是从本地发送的时候，会存在
 *  @param videoUrl         目标视频在服务器上的地址
 *  @param sender           发送者
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithVideoConverPhoto:(UIImage *)videoConverPhoto
                               videoPath:(NSString *)videoPath
                                videoUrl:(NSString *)videoUrl
                                  sender:(NSString *)sender;

/**
 *  初始化语音类型的消息
 *
 *  @param voicePath        目标语音的本地路径
 *  @param voiceUrl         目标语音在服务器的地址
 *  @param voiceDuration    目标语音的时长
 *  @param sender           发送者
 *
 *  @return 返回Message model 对象
 */
//- (instancetype)initWithVoicePath:(NSString *)voicePath
//                         voiceUrl:(NSString *)voiceUrl
//                    voiceDuration:(NSString *)voiceDuration
//                           sender:(NSString *)sender;


/**
 *  初始化语音类型的消息
 *
 *  @param voicePath        目标语音的本地路径
 *  @param voiceUrl         目标语音在服务器的地址
 *  @param voiceDuration    目标语音的时长
 *  @param sender           发送者
 *
 *  @return 返回Message model 对象
 */

/**
 *  初始化语音类型的消息
 *
 *  @param voiceId  GUID
 *  @param time     时间
 *  @param sender   发送者
 *  @param chatType 类型
 *
 *  @return 对象
 */
- (instancetype)initWithVoiceId:(NSString *)voiceId
                           time:(NSString *)time
                         sender:(NSString *)sender
                       toUserId:(NSString *)toUserId
                      groupName:(NSString *)groupName
                      voicePath:(NSString *)voicePath
                       chatType:(YNBubbleMessageChatType)chatType;

/**
 *  初始化语音类型的消息。增加已读未读标记
 *
 *  @param voicePath        目标语音的本地路径
 *  @param voiceUrl         目标语音在服务器的地址
 *  @param voiceDuration    目标语音的时长
 *  @param sender           发送者
 *  @param isRead           已读未读标记
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithVoicePath:(NSString *)voicePath
                         voiceUrl:(NSString *)voiceUrl
                    voiceDuration:(NSString *)voiceDuration
                           sender:(NSString *)sender
                           isRead:(BOOL)isRead;

/**
 *  初始化gif表情类型的消息
 *
 *  @param emotionName 表情的名字 [/0-80] (发送给别人用)
 *  @param emotionPath 表情的路径 方便自己用
 *  @param toUserId    接收者的UserId
 *  @param chatType    消息类型
 *  @param groupName    群名字(如果是群消息)
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithEmotionName:(NSString *)emotionName
                        emotionPath:(NSString *)emotionPath
                           toUserId:(NSString *)toUserId
                           chatType:(YNBubbleMessageChatType)chatType
                          groupName:(NSString *)groupName;

/**
 *  初始化地理位置的消息
 *
 *  @param localPositionPhoto 地理位置默认显示的图
 *  @param geolocations       地理位置的信息
 *  @param location           地理位置的经纬度
 *  @param sender             发送者
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithLocalPositionPhoto:(UIImage *)localPositionPhoto
                              geolocations:(NSString *)geolocations
                                  location:(CLLocation *)location
                                    sender:(NSString *)sender;

/**
 初始化回执消息
 
 @param toUserId 对方id、群讨论组id
 @return 消息对象
 */
- (instancetype)initWithReceiptMessageToUserId:(NSString *)toUserId;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma mark - initMethod

/**
 *  接收消息的时候, 根据Message创建YNMessage对象
 @param messageXP 消息源数据
 @param sourceType 是漫游的消息还是在线接收的
 @param isList 解析直播消息后加入的-消息来源是否为漫游列表消息时解析的最新的那条消息
 @return return value description
 */
- (instancetype)initWithXMPPMessage:(XMPPMessage *)messageXP messageSourceType:(GroupMessageSourceType)sourceType isFromSessionListLastMessage:(BOOL)isList;

/**
 *  发送消息的时候根据发送的消息的类型来初始化消息对象(初始化混合内型消息)
 *
 *  @param messageDic           初始化发送消息对象相关的信息
 *  @param messageMediaType     消息格式的类型
 *
 *  @return 返回Message model 对象
 */
- (instancetype)initWithMessageDictionary:(NSDictionary *)messageDic bubbleMessageMediaType:(YNBubbleMessageMediaType)messageMediaType;

/**
 *  根据多人会话数据表创建消息对象
 */
- (instancetype)initMessageWithManyPeopleChatTabel:(YNManyPeopleChat *)manyPeopleChat fileUploadUrlServer:(NSString*)fileUrlServer voicePath:(NSString*)voicePath;

/**
 *  根据单人会话数据表创建消息对象
 */
- (instancetype)initMessageWithTwoPeopleChatTabel:(YNTwoPeopleChat *)twoPeopleChat fileUploadUrlServer:(NSString*)fileUrlServer voicePath:(NSString*)voicePath;

//html转义
+ (NSString *)covertJsonWithHTML:(NSString *)body;
@end
